package rmy.service.impl;

import rmy.device.onbon.*;
import rmy.domain.BerrArea;
import rmy.domain.BerrParam;
import rmy.service.BerrInterface;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.List;

public class OnbonBerrDevice implements BerrInterface {


    @Override
    public boolean sendBerr(String strIp, int nPort, BerrParam compParam, List<BerrArea> berrAreaList) {
        List<BxArea> areas = new ArrayList<BxArea>();
        int nId = 0;
        // 1. 循环取值
        for (BerrArea berrArea : berrAreaList) {
            // 要显示的内容
            // 采用 GB2312 码
            // 注：\\C2 对应转义为 "\C2" 表示颜色为绿色
            String s1 = berrArea.getContent();
            byte [] data1 = new byte[0];
            try {
                data1 = s1.getBytes("gb2312");
                //五代K卡最后一个参数给true、非5代的给false
                BxAreaDynamic area1 = new BxAreaDynamic((byte) nId++,
                        berrArea.getX(), berrArea.getY(),
                        berrArea.getW(), berrArea.getH(), data1, true);
                area1.setDispMode((byte)berrArea.getMode());
                area1.setSpeed((byte)berrArea.getSpeed());
                area1.setHoldTime((byte)berrArea.getHoldtime());
                // 添加到列表
                areas.add(area1);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        // 2.转成cmd
        // 创建一个发送动态区命令
        BxCmd cmd = new BxCmdSendDynamicArea(areas);
        // 对命令进行封装
        BxDataPack dataPack = new BxDataPack(cmd);
        // 生成命令序列
        byte[] seq = dataPack.pack();

        // 3. 发送socket
        // 创建 Socket
        Socket client = new Socket();
        // 创建 socket 地址
        SocketAddress address = new InetSocketAddress(strIp, nPort);
        try {
            //
            // 建立 TCP 连接
            client.connect(address, 3000);
            //
            // 设置读超时时间
            client.setSoTimeout(3000);
            // 创建输出流
            OutputStream out = client.getOutputStream();
            // 创建输入流
            InputStream in = client.getInputStream();

            // 写入数据
            out.write(seq);
            // 回读返回帧
            byte[] resp = new byte[1024];
            int len = in.read(resp);
            // parse
            BxResp bxResp = BxResp.parse(resp, len);

            // 判断命令是否被正确执行
            if (bxResp.isAck()) {
                System.out.println("Well done!!");
            } else {
                System.out.println("I am sorry!");
            }

            //
            out.close();
            in.close();
            client.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }
}
